/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package caixa.bd;

import caixa.classes.Caixa;
import conexao.ConexaoSingleton;
import conexao.DAOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 *
 * @author Acer
 */
public class CaixaDao implements ICaixaDao{
    
    EntityManager manager;

    public CaixaDao() throws DAOException {
        try{
            this.manager = ConexaoSingleton.getConexao();
        } catch (SQLException ex) {
            throw  new DAOException(null, "Sem conexão com o Banco dados");
        }
    }

    public List<Caixa> getCaixas() throws DAOException {
        Query query = manager.createQuery("select c from Caixa c");
        return query.getResultList();
    }

    public Caixa getCaixa(int idCaixa) throws DAOException {
        Query query = manager.createQuery("Select c From Caixa c where idCaixa=" + idCaixa);
        return (Caixa) query.getSingleResult();
    }

    public void salvarCaixa(Caixa caixa) throws DAOException {
         try{
            manager.getTransaction().begin();
            manager.persist(caixa);
            manager.getTransaction().commit();
          }catch(Exception ex){
              if (manager.getTransaction().isActive()){
                  manager.getTransaction().rollback();
              }
              throw new DAOException("Erro ao Salvar no Banco de Dados", ex);
          }
    }

    public void excluirCaixa(Caixa caixa) throws DAOException {
        try{
            manager.getTransaction().begin();
            manager.remove(caixa);
            manager.getTransaction().commit();
          }catch(Exception ex){
              if (manager.getTransaction().isActive()){
                  manager.getTransaction().rollback();
              }
              throw new DAOException("Erro ao Excluir no Banco de Dados", ex);
          }
    }

    public List<Caixa> getCaixas(String historico) throws DAOException {
        try{
            Query query = manager.createNamedQuery("pesquisaHistorico");
            query.setParameter("historico", "%" + historico);
            return query.getResultList();
        }catch(Exception ex){
            throw new DAOException("Erro de consulta", ex);
        }

        
    }

    public List<Caixa> getCaixas(Date inicio, Date fim) throws DAOException {
        Query query = manager.createNativeQuery("Select * from Caixa where (dataCaixa>=" + inicio +
                ")  and (dataCaixa<=" + fim + ")" );
        return query.getResultList();
    }

    public List<Caixa> getCaixas(int planoContas) throws DAOException {
        Query query = manager.createQuery("Select c From Caixa c Where(c.conta=" + planoContas + "  order by c.dataConta");
        return query.getResultList();
    }

    public List<Double> calculaSaldos(Date dataCaixa) {
        Query query = manager.createNativeQuery("Select distinct sum(valorEntrada) as entrada " +
                "From Caixa where(dataCaixa=" + dataCaixa + ")");
        List<Double> saldo = new ArrayList<Double>();
        Double valor = (Double) query.getSingleResult();
        saldo.add(valor);
        query = manager.createNativeQuery("Select distinct sum(valorSaida) as saida " +
                "From Caixa where(dataCaixa=" + dataCaixa + ")");
        valor = (Double) query.getSingleResult();
        saldo.add(valor);
        query = manager.createNativeQuery("Select distinct sum(valorEntrada) as entrada " +
                "From Caixa where(dataCaixa<" + dataCaixa + ")");
        valor = (Double) query.getSingleResult();
        saldo.add(valor);
        query = manager.createNativeQuery("Select distinct sum(valorSaida) as saida " +
                "From Caixa where(dataCaixa<" + dataCaixa + ")");
        valor = (Double) query.getSingleResult();
        saldo.add(valor);
        return saldo;
    }

}
